/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bombercloud.server;

import bombercloud.commons.BlocoFixo;
import bombercloud.commons.BlocoQuebra;
import bombercloud.commons.Bomba;
import bombercloud.commons.Boneco;
import bombercloud.commons.Mapa;
import bombercloud.commons.Request;
import bombercloud.commons.Response;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

/**
 *
 * @author Leonardo Oliveira Moreira
 */
public class BomberCloudServerThread extends Thread {

    private Socket socket;
    private ArrayList<BlocoFixo> listParedes;
    private ArrayList<BlocoQuebra> listLugaresPossiveis;
    private ArrayList<BlocoQuebra> listLugaresNLivres;
    private ArrayList<BlocoQuebra> listLinhaDeFogo;
    private ArrayList<Bomba> listBombas;
    private ArrayList<Boneco> listBonecos;
    private ArrayList<BomberCloudServerThread> listTheradServidor;
    ObjectOutputStream outputStream = null;
    ObjectInputStream inputStream = null;

    public BomberCloudServerThread(
            Socket socket,
            ArrayList<BlocoQuebra> listLugaresPossiveis,
            ArrayList<BlocoFixo> listParedes,
            ArrayList<BlocoQuebra> listLugaresNLivres,
            ArrayList<Bomba> listBombas,
            ArrayList<Boneco> listBonecos,
            ArrayList<BomberCloudServerThread> listTheradSever,
            ArrayList<BlocoQuebra> listLinhaDeFogoo) {
        this.socket = socket;
        this.listParedes = listParedes;
        this.listLugaresPossiveis = listLugaresPossiveis;
        this.listLugaresNLivres = listLugaresNLivres;
        this.listBombas = listBombas;
        this.listBonecos = listBonecos;
        this.listTheradServidor = listTheradSever;
        this.listLinhaDeFogo = listLinhaDeFogoo;
    }

    @Override
    public void run() {

        boolean proceed = true;
        try {
            outputStream = new ObjectOutputStream((socket.getOutputStream()));
            inputStream = new ObjectInputStream((socket.getInputStream()));
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
            proceed = false;
        }
        System.out.println("Connection started - Servidor Rodando");
        while (proceed && socket != null && !socket.isClosed()) {
            try {
                //resecebe as requisições
                Request request = (Request) inputStream.readObject();
                Response response = new Response();
                response.setState(Response.RESPONSE_STATE_FAILURE);
                //variavel que auxilia quando uma requisição so envia resposta para todas as therads
                boolean outputNaoEnviado = true;
                switch (request.getType()) {
//                    
//                    case Request.REQUEST_TYPE_BOMBS: {
//                        /* colocar o codigo e dizer que foi sucesso */
//                        response.setState(Response.RESPONSE_STATE_SUCCESS);
//                        break;
//                    }
                    //Os blocos que quebram foram requisitados e estao na listaLugaresNLivres
                    case Request.REQUEST_TYPE_BROKE_BLOCKS: {

                        ArrayList<BlocoQuebra> listaBlocos = new ArrayList<BlocoQuebra>();
                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            ResultSet rs = stmt.executeQuery("select x, y from bloco ;");
                            while (rs.next()) {
                                BlocoQuebra bq = new BlocoQuebra();
                                bq.setX(rs.getInt("x"));
                                bq.setY(rs.getInt("y"));
                                listaBlocos.add(bq);
                            }
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }
                        response.setResponseObject(listaBlocos);
                        response.setType("BROKE_BLOCKS");
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        break;
                    }
                    //requisição para deletar a bomba, ou seja, remover da lista de lugares não livres
                    case Request.REQUEST_TYPE_DELETE_BOMBA: {
                        //recebe o "bloco" que é a bomba
                        BlocoQuebra BQbombaRecebida = (BlocoQuebra) request.getParam3();


                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            stmt.executeUpdate("delete from bomba where x = " + BQbombaRecebida.getX() + " AND y = " + BQbombaRecebida.getY());
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }



                        BlocoQuebra BQbombaAux = new BlocoQuebra();
                        Bomba bomba = new Bomba();
                        //procura a bomba na lista de lugares não livre
                        for (BlocoQuebra b : listLugaresNLivres) {
                            if (BQbombaRecebida.getX() == b.getX() && BQbombaRecebida.getY() == b.getY()) {
                                //encontrou a bomba
                                BQbombaAux = b;
                            }
                        }
                        //remove a bomba dos lugares não livre
                        listLugaresNLivres.remove(BQbombaAux);
                        for (Bomba b : listBombas) {
                            if (BQbombaRecebida.getX() == b.getX() && BQbombaRecebida.getY() == b.getY()) {
                                bomba = b;
                            }
                        }
                        //remove a bomba da lista de bombas
                        listBombas.remove(bomba);
                        //responde atualizando o mapa
                        response.setResponseObject(atualizaMapaParaEnnvio());
                        //envia a bomba que foi recebida para o método explosão colocar o fogo e remover os blocos
                        response.setResponseObject2(BQbombaRecebida);
                        response.setType("DELETE_BOMBA");
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        //envia para todas as threads cliente
                        for (BomberCloudServerThread bct : listTheradServidor) {
                            bct.outputStream.writeObject(response);
                            bct.outputStream.reset();
                        }
                        //output já enviado
                        outputNaoEnviado = false;
                        break;
                    }

                    //remove o fogo, esse request é feito apos o sleep da thread fogo
                    case Request.REQUEST_TYPE_DELETE_FOGO: {
                        //recebe a lista de onde esta o fogo
                        ArrayList<BlocoQuebra> listFogo = (ArrayList<BlocoQuebra>) request.getParam3();


                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            for (BlocoQuebra f : listFogo) {
                                stmt.executeUpdate("delete from fogo where x = " + f.getX() + " AND y = " + f.getY());
                            }
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }


                        //responde atualizando o mapa
                        response.setResponseObject(atualizaMapaParaEnnvio());
                        //responde com a lista de fogo
                        response.setResponseObject2(listFogo);
                        response.setType("DELETE_FOGO");
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        break;
                    }

                    //coloca a bomba na lista de bombas
                    case Request.REQUEST_TYPE_CREATE_BOMBA: {
                        Bomba bomba = new Bomba();
                        bomba.setX(request.getParam1());
                        bomba.setY(request.getParam2());
                        //recebe o bloco quebra com imagem de bomba
                        bomba.setjLabelBomba((JLabel) request.getParam3());
                        //recebe a nova lista de lugares livres com a bomba inclusa quando pressiona "a"
                        listLugaresNLivres = (ArrayList<BlocoQuebra>) request.getParam4();
                        bomba.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "Bomba.gif");
                        //adiciona a bomba na lista de bombas
                        listBombas.add(bomba);
                        //responde atualizando o mapa para pegar a nova lista de ligares não livre
                        response.setResponseObject(atualizaMapaParaEnnvio());
                        response.setType("CREATE_BOMBA");
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        //envia para todas as threads cliente
                        for (BomberCloudServerThread bct : listTheradServidor) {
                            bct.outputStream.writeObject(response);
                            bct.outputStream.reset();
                        }
                        //output já enviado
                        outputNaoEnviado = false;
                        break;
                    }
                    //Remove os blocos encontrados pela bomba
                    case Request.REQUEST_TYPE_DELETE_BLOCOS: {
                        //recebe a lista de blocos para remover da lista de lugares não livre
                        ArrayList<BlocoQuebra> blocosARemover = (ArrayList<BlocoQuebra>) request.getParam3();
                        //verifica se achou algum bloco
                        if (blocosARemover != null && blocosARemover.size() > 0) {
                            ArrayList<BlocoQuebra> listaAux = new ArrayList<BlocoQuebra>();
                            //procura os blocos a serem removidos e coloca na lista aux
                            for (BlocoQuebra b : listLugaresNLivres) {
                                for (BlocoQuebra rb : blocosARemover) {
                                    if (b.getX() == rb.getX() && b.getY() == rb.getY()) {
                                        listaAux.add(b);
                                    }
                                }
                            }
                            //remove os blocos encontrados na lista auxiliar da lista de lugares não livre

                            try {
                                Class.forName("org.postgresql.Driver");
                                Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                                Statement stmt = connection.createStatement();
                                for (BlocoQuebra b : listaAux) {
                                    stmt.executeUpdate("delete from bloco where x = " + b.getX() + " AND y = " + b.getY());
                                }
                                stmt.close();
                                connection.close();
                            } catch (SQLException ex) {
                                JOptionPane.showMessageDialog(null, ex.getMessage());
                            } catch (ClassNotFoundException ex) {
                                JOptionPane.showMessageDialog(null, ex.getMessage());
                            }

                            for (BlocoQuebra b : listaAux) {
                                listLugaresNLivres.remove(b);
                            }
                        }
                        //responde com a nova lista atualizando o mapa
                        response.setResponseObject(atualizaMapaParaEnnvio());
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        response.setType("DELETE_BLOCOS");
                        break;
                    }

                    //remove boneco enncontrado pela bomba
                    case Request.REQUEST_TYPE_DELETE_BONECO: {
                        //recebe o boneco para remoção
                        ArrayList<Boneco> bonecosARemover = (ArrayList<Boneco>) request.getParam3();
                        ArrayList<Boneco> listaAux = new ArrayList<Boneco>();
                        //verifica se foi enviado algum boneco para remover
                        if (bonecosARemover != null & bonecosARemover.size() > 0) {


                            try {
                                Class.forName("org.postgresql.Driver");
                                Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                                Statement stmt = connection.createStatement();
                                for (Boneco b : bonecosARemover) {
                                    stmt.executeUpdate("delete from bloco where x = " + b.getX() + " AND y = " + b.getY());
                                }
                                stmt.close();
                                connection.close();
                            } catch (SQLException ex) {
                                JOptionPane.showMessageDialog(null, ex.getMessage());
                            } catch (ClassNotFoundException ex) {
                                JOptionPane.showMessageDialog(null, ex.getMessage());
                            }

                            for (Boneco boneco : listBonecos) {
                                for (Boneco rb : bonecosARemover) {
                                    //procura os bonecos a remover na lista de bonecos
                                    if (boneco.getNumero() == rb.getNumero()) {
                                        listaAux.add(boneco);
                                    }
                                }
                            }
                            //remove os bonecos encontrados
                            //verifica se foi encontrado algum boneco
                            if (listaAux != null && listaAux.size() > 0) {
                                for (Boneco b : listaAux) {
                                    listBonecos.remove(b);
                                }
                            }
                        }
                        //responde com o novo mapa
                        response.setResponseObject(atualizaMapaParaEnnvio());
                        //responde com a lista de bonecos que removeu para alterar o placar
                        response.setResponseObject2(bonecosARemover);
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        response.setType("DELETE_BONECO");
                        break;
                    }
                    //requisita a quantidade de bonecos ue ainda estão nao fase
                    case Request.REQUEST_TYPE_VERIFICA_QTD_BONECOS: {
                        //se responder com 2 tem mais de um boneco no jogo
                        if (listBonecos.size() >= 2) {
                            response.setQtdBoneco(2);
                        }
                        //se responder com 1 ele é o vencedor
                        if (listBonecos.size() == 1) {
                            response.setQtdBoneco(1);
                        }
                        //se responder com 0 deu empate
                        if (listBonecos.size() == 0) {
                            response.setQtdBoneco(0);
                        }
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        response.setType("QTD_BONECOS");
                        break;
                    }

                    //Os blocos fixos, as paredes, estao na listaParedes
                    case Request.REQUEST_TYPE_FIXED_BLOCKS: {
                        //responde com a lista das paredes
                        ArrayList<BlocoFixo> listaParede = new ArrayList<BlocoFixo>();
                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            ResultSet rs = stmt.executeQuery("select x, y from parede;");
                            while (rs.next()) {
                                BlocoFixo bq = new BlocoFixo();
                                bq.setX(rs.getInt("x"));
                                bq.setY(rs.getInt("y"));
                                listaParede.add(bq);
                            }
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }

                        response.setResponseObject(listaParede);
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        response.setType("FIXED_BLOCKS");
                        break;
                    }
                    //Requisição de criação de um boneco, pega o param1 que foi mandado e cria o correspondente a ele
                    case Request.REQUEST_TYPE_CREATE_PLAYER: {
                        //verifica se já existem 5 jogadores
                        if (listBonecos.size() < 5) {
                            Boneco b = new Boneco();

                            // <editor-fold defaultstate="collapsed" desc="// CRIAÇÃO DO BONECO ------------------------">
                            switch (request.getParam1()) {
                                case 1: {
                                    b.setX(49);
                                    b.setY(140);
                                    b.setNumero(1);
                                    b.setPoder(1);
                                    b.setNumBomba(1);
                                    b.setEscolhido(false);
                                    b.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "brancoPARADO.png");
                                    b.setImagemPLACAR(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "BRANCO_FOTO.png");
                                    b.setImagemCIMA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "brancoCIMA.gif");
                                    b.setImagemBAIXO(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "brancoBAIXO.gif");
                                    b.setImagemDIREITA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "brancoDIREITA.gif");
                                    b.setImagemESQUERDA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "brancoESQUERDA.gif");


                                    try {
                                        Class.forName("org.postgresql.Driver");
                                        Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                                        Statement stmt = connection.createStatement();
                                        stmt.execute("INSERT INTO boneco (num_boneco) VALUES (1);");
                                        stmt.close();
                                        connection.close();
                                    } catch (SQLException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    } catch (ClassNotFoundException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    }



                                    break;
                                }
                                case 2: {
                                    b.setX(637);
                                    b.setY(540);
                                    b.setNumero(2);
                                    b.setPoder(1);
                                    b.setNumBomba(1);
                                    b.setEscolhido(false);
                                    b.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "pretoPARADO.png");
                                    b.setImagemPLACAR(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "PRETO_FOTO.png");
                                    b.setImagemCIMA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "pretoCIMA.gif");
                                    b.setImagemBAIXO(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "pretoBAIXO.gif");
                                    b.setImagemDIREITA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "pretoDIREITA.gif");
                                    b.setImagemESQUERDA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "pretoESQUERDA.gif");

                                    try {
                                        Class.forName("org.postgresql.Driver");
                                        Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                                        Statement stmt = connection.createStatement();
                                        stmt.execute("INSERT INTO boneco (num_boneco) VALUES (2);");
                                        stmt.close();
                                        connection.close();
                                    } catch (SQLException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    } catch (ClassNotFoundException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    }

                                    break;
                                }
                                case 3: {
                                    b.setX(637);
                                    b.setY(140);
                                    b.setNumero(3);
                                    b.setPoder(1);
                                    b.setNumBomba(1);
                                    b.setEscolhido(false);
                                    b.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "azulPARADO.png");
                                    b.setImagemPLACAR(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "AZUL_FOTO.png");
                                    b.setImagemCIMA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "azulCIMA.gif");
                                    b.setImagemBAIXO(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "azulBAIXO.gif");
                                    b.setImagemDIREITA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "azulDIREITA.gif");
                                    b.setImagemESQUERDA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "azulESQUERDA.gif");

                                    try {
                                        Class.forName("org.postgresql.Driver");
                                        Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                                        Statement stmt = connection.createStatement();
                                        stmt.execute("INSERT INTO boneco (num_boneco) VALUES (3);");
                                        stmt.close();
                                        connection.close();
                                    } catch (SQLException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    } catch (ClassNotFoundException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    }

                                    break;
                                }
                                case 4: {
                                    b.setX(49);
                                    b.setY(540);
                                    b.setNumero(4);
                                    b.setPoder(1);
                                    b.setNumBomba(1);
                                    b.setEscolhido(false);
                                    b.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "vermelhoPARADO.png");
                                    b.setImagemPLACAR(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "VERMELHO_FOTO.png");
                                    b.setImagemCIMA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "vermelhoCIMA.gif");
                                    b.setImagemBAIXO(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "vermelhoBAIXO.gif");
                                    b.setImagemDIREITA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "vermelhoDIREITA.gif");
                                    b.setImagemESQUERDA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "vermelhoESQUERDA.gif");

                                    try {
                                        Class.forName("org.postgresql.Driver");
                                        Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                                        Statement stmt = connection.createStatement();
                                        stmt.execute("INSERT INTO boneco (num_boneco) VALUES (4);");
                                        stmt.close();
                                        connection.close();
                                    } catch (SQLException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    } catch (ClassNotFoundException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    }

                                    break;
                                }
                                case 5: {
                                    b.setX(343);
                                    b.setY(300);
                                    b.setNumero(5);
                                    b.setPoder(1);
                                    b.setNumBomba(1);
                                    b.setEscolhido(false);
                                    b.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "verdePARADO.png");
                                    b.setImagemPLACAR(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "VERDE_FOTO.png");
                                    b.setImagemCIMA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "verdeCIMA.gif");
                                    b.setImagemBAIXO(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "verdeBAIXO.gif");
                                    b.setImagemDIREITA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "verdeDIREITA.gif");
                                    b.setImagemESQUERDA(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "verdeESQUERDA.gif");

                                    try {
                                        Class.forName("org.postgresql.Driver");
                                        Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                                        Statement stmt = connection.createStatement();
                                        stmt.execute("INSERT INTO boneco (num_boneco) VALUES (5);");
                                        stmt.close();
                                        connection.close();
                                    } catch (SQLException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    } catch (ClassNotFoundException ex) {
                                        JOptionPane.showMessageDialog(null, ex.getMessage());
                                    }

                                    break;
                                }
                            }
                            // </editor-fold> 

                            //adiciona o boneco que foi criado na lista do servidor
                            listBonecos.add(b);
                            //responde a requisiçã com um objeto boneco que foi criado do tipo Boneco
                            response.setResponseObject(b);
                            response.setState(Response.RESPONSE_STATE_SUCCESS);

                            response.setType("CREATE_PLAYER");
                            //
                            response.setResponseObject2(listBonecos);
                            //for que percorre todas as threads servidor. 
                            for (BomberCloudServerThread bct : listTheradServidor) {
                                //verifica quem requisitou a criação para a thread cliente saber se vai setar o boneco ou se vai atualizar as dizendo que
                                //o boneco correspondente já foi escolhido. se for o pai será setado
                                if (bct != this) {
                                    response.setResponseObjectPai(false);
                                    bct.outputStream.writeObject(response);
                                    bct.outputStream.reset();
                                } else {
                                    response.setResponseObjectPai(true);
                                    outputStream.writeObject(response);
                                    outputStream.reset();
                                }
                            }
                            outputNaoEnviado = false;
                            break;
                        }
                    }
                    //requisisão dos bonecos para criar na fase.
                    case Request.REQUEST_TYPE_PLAYERS: {
                        response.setResponseObject(listBonecos);
                        response.setType("PLAYERS");
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
//                        for (BomberCloudServerThread bct : listTheradServidor) {
//                            bct.outputStream.writeObject(response);
//                            bct.outputStream.reset();
//                        }
//                        outputNaoEnviado = false;
                        break;
                    }
                    //requisição para iniciar a partida
                    case Request.REQUEST_TYPE_START: {
                        response.setType("START");
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        //envia o mapa para ser criado
                        response.setResponseObject(atualizaMapaParaEnnvio());
                        for (BomberCloudServerThread bct : listTheradServidor) {
                            bct.outputStream.writeObject(response);
                            bct.outputStream.reset();
                        }
                        outputNaoEnviado = false;
                        break;
                    }
                    //requisição para finalizar a partida
                    case Request.REQUEST_TYPE_FINALIZA: {

                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            stmt.executeUpdate("delete from bloco");
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }
                        
                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            stmt.executeUpdate("delete from caminho_livre");
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }
                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            stmt.executeUpdate("delete from bomba");
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }
                        
                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            stmt.executeUpdate("delete from fogo");
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }
                        
                        try {
                            Class.forName("org.postgresql.Driver");
                            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
                            Statement stmt = connection.createStatement();
                            stmt.executeUpdate("delete from boneco");
                            stmt.close();
                            connection.close();
                        } catch (SQLException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        } catch (ClassNotFoundException ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage());
                        }

                        response.setType("FINALIZA");
                        ArrayList<Boneco> listAux = new ArrayList<Boneco>();
                        if (listBonecos.size() > 0) {
                            for (Boneco b : listBonecos) {
                                listAux.add(b);
                            }
                            for (Boneco b : listAux) {
                                listBonecos.remove(b);
                            }
                        }
                        //metodo para redesenhar os blocos.
                        criaNovoTabuleiro();
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        for (BomberCloudServerThread bct : listTheradServidor) {
                            bct.outputStream.writeObject(response);
                            bct.outputStream.reset();
                        }
                        outputNaoEnviado = false;
                        break;
                    }
                    //requisição de um movimento de um boneco.
                    case Request.REQUEST_TYPE_MOVIMENT: {
                        //recebe o boneco que se moveu
                        Boneco boneco = (Boneco) request.getParam3();
                        //procura o boneco que se moveu
                        for (Boneco b : listBonecos) {
                            //ao achar o boneco na lista, atualiza a nova posição do boneco na lista de bonecos
                            if (b.getNumero() == boneco.getNumero()) {
                                b.setX(request.getParam1());
                                b.setY(request.getParam2());
                                boneco = b;
                            }
                        }
                        response.setType("MOVIMENT");
                        response.setState(Response.RESPONSE_STATE_SUCCESS);
                        //envia o boneco para a thread cliente movimentar ele nas demias telas
                        response.setResponseObject2(boneco);
                        //for que percorre todas as threads servidor.
                        for (BomberCloudServerThread bct : listTheradServidor) {
                            //if para enviar a resposta diferenciada para quem requisitou
                            if (bct != this) {
                                response.setResponseObjectPai(false);
                                bct.outputStream.writeObject(response);
                                bct.outputStream.reset();
                            } else {
                                response.setResponseObjectPai(true);
                                outputStream.writeObject(response);
                                outputStream.reset();
                            }
                        }
                        outputNaoEnviado = false;
                        break;
                    }

                }
                //verifica se o output ja foi emviado
                if (outputNaoEnviado) {
                    outputStream.writeObject(response);
                    outputStream.reset();
                }


                //responder para todas as thrads que mantem socket como cliente 
            } catch (IOException ex) {
                ex.printStackTrace();
                System.out.println(ex.getMessage());
                proceed = false;
            } catch (ClassNotFoundException ex) {
                System.out.println(ex.getMessage());
                ex.printStackTrace();
                proceed = false;
            }
        }
        if (socket != null && !socket.isClosed()) {
            try {
                socket.close();
            } catch (IOException ex) {
            } finally {
                socket = null;
            }
        }
        this.listTheradServidor.remove(this);
        System.out.println("Connection ended");
    }

    public Mapa atualizaMapaParaEnnvio() {
        Mapa mapa = new Mapa();
        mapa.setListBombas(listBombas);
        mapa.setListBonecos(listBonecos);
        mapa.setListLugaresNLivres(listLugaresNLivres);
        mapa.setListParedes(listParedes);
        mapa.setListLugaresPossiveis(listLugaresPossiveis);
        mapa.setListLinhaDeFogo(listLinhaDeFogo);
        return mapa;
    }

    public void criaNovoTabuleiro() {
        //CRIAÇÃO DOS BLOCOS QUE QUEBRAM
        listLugaresPossiveis = new ArrayList<BlocoQuebra>();
        listLugaresNLivres = new ArrayList<BlocoQuebra>();

        for (int j = 1; j < 12; j++) {
            int aux2 = j * 40 + 100;
            if (!(j % 2 == 0)) {
                for (int i = 1; i < 14; i++) {
                    //if que retira as posições de escape inicial da lista
                    boolean condicao = (i != 1 || j != 1) && ((i != 2) || j != 1)
                            && ((i != 12) || j != 1) && ((i != 13) || j != 1)
                            && ((i != 6) || j != 5) && ((i != 7) || j != 5)
                            && ((i != 1) || j != 11) && ((i != 2) || j != 11)
                            && ((i != 12) || j != 11) && ((i != 13) || j != 11);
                    if (condicao) {
                        int aux = i * 49;
                        BlocoQuebra bq = new BlocoQuebra();
                        bq.setX(aux);
                        bq.setY(aux2);
                        listLugaresPossiveis.add(bq);
                    }
                }
            } else {
                for (int i = 1; i < 14; i++) {
                    //if que retira as posições de escape inicial da lista
                    boolean condicao = (i != 1 || j != 2) && ((i != 13) || j != 2)
                            && ((i != 7) || j != 6) && ((i != 1) || j != 10)
                            && ((i != 13) || j != 10);
                    if (condicao) {
                        if (!(i % 2 == 0)) {
                            int aux = i * 49;
                            BlocoQuebra bq = new BlocoQuebra();
                            bq.setX(aux);
                            bq.setY(aux2);
                            listLugaresPossiveis.add(bq);
                        }
                    }
                }
            }
        }

        int cont = 0;
        //68 é a quantidade de blocos que são colocados na tela
        while (cont < 68) {
            int var = (int) (Math.random() * 98);
            BlocoQuebra bq = new BlocoQuebra();
            bq = listLugaresPossiveis.get(var);
            if (!bq.isEscolhido()) {
                bq.setEscolhido(true);
                bq.setImagem(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "Bloco_quebra.png");
                listLugaresNLivres.add(bq);
                cont++;
            }
        }

        try {
            Class.forName("org.postgresql.Driver");
            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bomberCloud", "postgres", "postgres");
            Statement stmt = connection.createStatement();
            for (BlocoQuebra bq : listLugaresNLivres) {
                stmt.execute("INSERT INTO bloco (x, y) VALUES (" + bq.getX() + ", " + bq.getY() + ");");
            }
            for (BlocoQuebra bq : listLugaresPossiveis) {
                stmt.execute("INSERT INTO caminho_livre (x, y) VALUES (" + bq.getX() + ", " + bq.getY() + ");");
            }
            stmt.close();
            connection.close();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }



    }
    //método que o senhor disse que enviaria o mapa para as interfaces atualizarem.
//    public void enviar(Mapa m) {
//        Request r = new Request();
//        r.setParam3(m);
//        try {
//            outputStream.writeObject(r);
//            outputStream.reset();
//        } catch (IOException ex) {
//            Logger.getLogger(BomberCloudServerThread.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }
}